package com.woniuxy.controller;

import com.github.pagehelper.PageInfo;
import com.woniuxy.entity.DTO.*;
import com.woniuxy.entity.ShoppingCart;
import com.woniuxy.entity.TimeSaleStatus;
import com.woniuxy.service.TimeSaleService;
import com.woniuxy.util.PageParam;
import com.woniuxy.util.ResponseData;
import com.woniuxy.util.ResponseEnum;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.ParseException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author ：admin
 * @version ：1.0
 * @date ：Created in 2025/5/14 15:16
 * @description ：TODO
 * @modified_by ：
 */
@RestController
@RequestMapping("/timesale")
public class TimeSaleController {
    @Resource
    private TimeSaleService timeSaleService;

    /**
     * <p>查询所有活动状态。</p>
     * @return 活动状态列表
     */
    @GetMapping("/queryStatusList")
    public ResponseData<?> queryStatusList() {
        List<TimeSaleStatus> statusList = timeSaleService.queryStatusList();
        return ResponseData.success(statusList);
    }

    /**
     * <p>查询所有活动基本信息。</p>
     * @param param 分页信息（此处 param 为 null ）
     * @return 活动信息列表
     */
    @PostMapping("/queryTimeSaleList")
    public ResponseData<?> queryTimeSaleList(@RequestBody PageParam<FlashSalesDTO> param) {
        PageInfo<FlashSalesDTO> pageInfo = timeSaleService.queryTimeSaleList(param);
        if (pageInfo == null) {
            return ResponseData.fail(ResponseEnum.ERROR_PARAM); // 如果 pageInfo 为空，则代表前端传递参数不正确
        }
        return ResponseData.success(pageInfo);
    }

    /**
     * <p>根据条件分页查询活动信息。</p>
     * @param param 分页信息、查询条件
     * @return 活动信息列表
     */
    @PostMapping("/queryTimeSaleByCondition")
    public ResponseData<?> queryTimeSaleByCondition(@RequestBody PageParam<FlashSalesDTO> param) {
        PageInfo<FlashSalesDTO> pageInfo = timeSaleService.queryTimeSaleByCondition(param);
        if (pageInfo == null) {
            return ResponseData.fail(ResponseEnum.ERROR_PARAM);
        }
        return ResponseData.success(pageInfo);
    }

    /**
     * <p>添加活动信息。</p>
     * @param flashSalesDTO 活动信息及活动商品信息
     * @return 是否添加成功
     */
    @PostMapping("/addTimeSale")
    public ResponseData<?> addTimeSale(@RequestBody FlashSalesDTO flashSalesDTO) {
        // 参数校验
        if (Boolean.FALSE.equals(checkModifyTimeSaleParam(flashSalesDTO)))
            return ResponseData.fail(ResponseEnum.ERROR_PARAM);

        timeSaleService.addTimeSale(flashSalesDTO);
        return ResponseData.success();
    }

    /**
     * <p>修改活动信息。</p>
     * @param flashSalesDTO 活动信息
     * @return 是否修改成功
     */
    @PostMapping("/updateTimeSale")
    public ResponseData<?> updateTimeSale(@RequestBody FlashSalesDTO flashSalesDTO) {
        // 参数校验
        if (Boolean.FALSE.equals(checkModifyTimeSaleParam(flashSalesDTO)))
            return ResponseData.fail(ResponseEnum.ERROR_PARAM);

        timeSaleService.updateTimeSale(flashSalesDTO);
        return ResponseData.success();
    }

    /**
     * <p>查询所有“已上架”状态，且库存不为 0 的商品。</p>
     * @return 商品列表
     */
    @GetMapping("/queryAvailableGoods")
    public ResponseData<?> queryAvailableGoods(@RequestParam("name") String name) {
        List<QueryAvailableGoodsDTO> goodsList = timeSaleService.queryAvailableGoods(name);
        return ResponseData.success(goodsList);
    }

    /**
     * <p>根据活动 ID 查询活动详情。</p>
     * @param saleId 活动 ID
     * @return 活动详情信息
     */
    @GetMapping("/queryTimeSaleDetail/{saleId}")
    public ResponseData<?> queryTimeSaleDetail(@PathVariable("saleId") Integer saleId) {
        FlashSalesDTO flashSalesDTO = timeSaleService.queryTimeSaleDetail(saleId);
        return ResponseData.success(flashSalesDTO);
    }

    /**
     * <p>取消活动。</p>
     * @param saleId 活动 ID
     * @return 是否取消成功
     */
    @GetMapping("/cancelTimeSale")
    public ResponseData<?> cancelTimeSale(@RequestParam("saleId") Integer saleId) {
        return timeSaleService.cancelTimeSale(saleId);
    }

    /**
     * <p>根据商品名称查询活动商品信息。</p>
     *
     * @param searchKey 用户输入的商品名称
     * @return 活动商品信息列表
     */
    @PostMapping("/queryTimeSaleProducts")
    public ResponseData<?> queryTimeSaleProducts(@RequestBody(required = false) String searchKey) {
        if ("0".equals(searchKey)) {
            searchKey = null;
        }
        List<QueryTimeSaleGoodsDTO> goodsList;
        try {
            goodsList = timeSaleService.queryTimeSaleByGoodsName(searchKey);
        } catch (ParseException e) {
            return ResponseData.fail(ResponseEnum.QUERY_FAIL);
        }
        return ResponseData.success(goodsList);
    }

    /**
     * <p>保存抢购页面添加购物车信息。</p>
     *
     * @param queryTimeSaleGoodsDTOs 购物车信息
     */
    @PostMapping("/saveCart")
    public ResponseData<?> saveCart(@RequestBody List<QueryTimeSaleGoodsDTO> queryTimeSaleGoodsDTOs) {
        timeSaleService.saveCart(queryTimeSaleGoodsDTOs);
        return ResponseData.success();
    }

    /**
     * <p>校验限时抢购活动的参数。</p>
     * @param flashSalesDTO 参数
     * @return 通过时返回 true ，不通过时返回 false
     */
    private static Boolean checkModifyTimeSaleParam(FlashSalesDTO flashSalesDTO) {
        // 非空判断（1.活动信息不可为空，2.活动商品信息不可为空）
        if (flashSalesDTO == null || flashSalesDTO.getGoodsList().isEmpty()) return false;

        // 活动状态校验（仅限未开始状态的活动可以编辑）
        Integer saleStatus = flashSalesDTO.getSaleStatus();
        if (saleStatus == null || saleStatus != 1) return false;

        // 活动时间校验（1.活动开始时间不得早于当前系统时间，2.活动开始时间不得晚于结束时间，3.活动开始前1小时内不允许修改活动信息）
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime startTime = LocalDateTime.parse(flashSalesDTO.getStartTime(), dateTimeFormatter);
        LocalDateTime endTime = LocalDateTime.parse(flashSalesDTO.getEndTime(), dateTimeFormatter);
        if (startTime.minusHours(1).isBefore(LocalDateTime.now()) || endTime.isBefore(startTime)) return false;

        // 活动价格、活动库存校验（1.现价不得低于活动价，2.库存不得少于活动库存）
        for (FlashSaleProductDTO flashSaleProductDTO : flashSalesDTO.getGoodsList()) {
            BigDecimal price = flashSaleProductDTO.getPrice();
            BigDecimal flashPrice = flashSaleProductDTO.getFlashPrice();
            if (price.compareTo(flashPrice) < 0) return false;

            Integer stock = flashSaleProductDTO.getStock();
            Integer flashStock = flashSaleProductDTO.getFlashStock();
            if (stock.compareTo(flashStock) < 0) return false;
        }

        return true;
    }
}
